package com.hpch.business.util;

import com.hpch.common.core.utils.JSONUtil;
import okhttp3.*;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class StreamExample {

    public static void main(String[] args) {


        // 发起对话
        String chatUrl = "https://api.coze.cn/v3/chat";

        String token = "Bearer pat_8x0uaDnLGmg68xhKffq6FuXOJIRApAX1Re8lHnsIl7XLwew6ZQ2rvCaG6V4RpV9G";

        // 参数
        Map<String, Object> bodyMap = new HashMap<>();
        bodyMap.put("bot_id", "7480800297339011072");
        // user_id
        bodyMap.put("user_id", "123");

        // auto_save_history
        bodyMap.put("auto_save_history", true);
        // stream
        bodyMap.put("stream", true);


        // additional_messages
        List<Map<String, Object>> additional_messagesList = new ArrayList();


        Map<String, Object> additional_messages = new HashMap<>();
        /**
         * String
         * 必选
         * 发送这条消息的实体。取值：
         * user：代表该条消息内容是用户发送的。
         * assistant：代表该条消息内容是智能体发送的。
         */
        additional_messages.put("role", "user");
        additional_messages.put("content_type", "object_string");
//        additional_messages.put("content_type", "text");

        /**
         * 消息的内容，支持纯文本、多模态（文本、图片、文件混合输入）、卡片等多种类型的内容。
         * content_type 为 object_string 时，content 为 object_string object 数组序列化之后的 JSON String，详细说明可参考 object_string object。
         * 当 content_type = text 时，content 为普通文本，例如 "content" :"Hello!"。
         */

        List<Map<String, Object>> contentList = new ArrayList();
        Map<String, Object> content = new HashMap<>();
        content.put("type", "text");
        content.put("text", "你好,你是做什么的？");
        contentList.add(content);
        additional_messages.put("content", JSONUtil.toJSONString(contentList));


        additional_messagesList.add(additional_messages);
        bodyMap.put("additional_messages", additional_messagesList);
//        bodyMap.put("content", "你好,你是做什么的？");
        //
        System.out.println("bodyMap::::"+JSONUtil.toJSONString(bodyMap));


        OkHttpClient client = new OkHttpClient();

        // 假设这是流式 API 的 URL

        Request request = new Request.Builder()
                .url(chatUrl)
                .header("Authorization", token)
                // content-type 为 application/json
                .post(RequestBody.create(MediaType.get("application/json"), JSONUtil.toJSONString(bodyMap)))
                .build();

        // 异步处理流式响应
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (!response.isSuccessful()) {
                    System.err.println("请求失败: " + response.code());
                    return;
                }

                try (ResponseBody responseBody = response.body()) {
                    // 持续读取流式数据
                    while (!responseBody.source().exhausted()) {
                        String chunk = responseBody.source().readUtf8Line();
                        if (chunk != null) {
                            System.out.println("收到数据块: " + chunk);
                            // 解析 chunk（可能是 JSON 片段或 SSE 格式）
                        }
                    }
                }
            }
        });

        // 防止主线程退出（根据实际情况调整）
        try {
            Thread.sleep(Long.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
